<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {

    public function index(){
        session('name',null);
        if(session('name') == ''){
            $this -> success('用户注销成功',U('Index/index'));
            return;
        }else{
            $this -> error('用户注销失败',U('fenxianziyuan'));
            return;
        }
    }

    public function fenxianziyuan(){
        $this -> assign('title','分享资源');
        // 调用判断渲染方法,渲染登陆注册位置
        $this -> gongxianzhe();
        if(IS_POST){
            // 判断用户是否登录
            if(session('name') == ''){
                $this -> error('分享资源前，请您先登录，我们将以此作为该资源的贡献者！',U('denglu'));
                return;
            }
            // 判断验证码是否输入正确
            if(!$this->check_verify($_POST['checkcode'],'')){
                $this -> error('验证码错误,请输入正确验证码',U('fenxianziyuan'));
                return;
            }     
            // 对技术分类进行校验
            $this -> panduan('jishu');
            // 对菜单分类进行校验
            $this -> panduan('caidan');
            // 对子菜单分类进行校验
            $this -> panduan('zicaidan');
            //判断资源名和链接地址是否为空和默认值
            if($_POST['ziyuanming'] == "资源名" || $_POST['ziyuanming'] == ""){
                $this -> error('资源名不能为空,并且不能为默认值',U('fenxianziyuan'));
                return;
            }
            //判断资源名和链接地址是否为空和默认值
            if($_POST['lianjie'] == "链接地址" || $_POST['lianjie'] == ""){
                $this -> error('链接地址不能为空,并且不能为默认值',U('fenxianziyuan'));
                return;
            }
            // 判断完成，创建插入数组
            // 删除验证码字段
            unset($_POST['checkcode']);
            $_POST['fenlei'] = "全部";
            $_POST['shijian'] = time();
            $_POST['shenhe'] = 0;
            // 对用户输入数据进行字符实体化
            $_POST['jishu'] = htmlspecialchars($_POST['jishu']);
            $_POST['caidan'] = htmlspecialchars($_POST['caidan']);
            $_POST['zicaidan'] = htmlspecialchars($_POST['zicaidan']);
            $_POST['ziyuanming'] = htmlspecialchars($_POST['ziyuanming']);
            $_POST['lianjie'] = htmlspecialchars($_POST['lianjie']);
            $_POST['gongxianzhe'] = htmlspecialchars(session('name'));
            $data = array('jishu' => $_POST['jishu'],'caidan' => $_POST['caidan'],'zicaidan' => $_POST['zicaidan'],'ziyuanming' => $_POST['ziyuanming'],'lianjie' => $_POST['lianjie'],'fenlei' => $_POST['fenlei'],'shijian' => $_POST['shijian'],'gongxianzhe' => $_POST['gongxianzhe'],'shenhe' => $_POST['shenhe']);
            $ziyuan = M('ziyuan');
            $res = $ziyuan -> data($data) -> add();
            if($res){
                $this -> success('谢谢，资源分享成功,请等待审核！',U('fenxianziyuan'));
                return;
            }else{
                $this -> error('抱歉，资源分享失败，请重新输入！',U('fenxianziyuan'));
                return;
            } 

            //如何在调试过程中,看到接收到的数据,使用写文件(日志)的方式
            // file_put_contents("d:/mylog.log",$_POST."\r\n",FILE_APPEND);
            // var_dump($_POST);die();

        }
        $this -> display();
    }

    // 分享资源的校验方法
    public function panduan($zhi){
        // 对资源分类进行校验,确保数据库中有该分类
        $ziyuan = M('ziyuan');
        $res = $ziyuan -> query("select distinct ".$zhi." from ziyuan ");
        foreach ($res as $value) {
            foreach ($value as $jishu) {
                if($jishu == $_POST[$zhi]){
                    $panduan = true;
                }
            }
        }
        if(!$panduan){
            $this -> error('分享资源前,请您先选择技术分类',U('fenxianziyuan'));
            return;
        }
    }

    public function denglu(){
        $this -> assign('title','登陆');
        // 调用判断渲染方法,渲染登陆注册位置
        $this -> gongxianzhe();
        if(IS_POST){
            // 判断验证码是否输入正确
            if(!$this->check_verify($_POST['checkcode'],'')){
                $this -> error('验证码错误,请输入正确验证码',U('denglu'));
                return;
            }
            // 判断用户名是否为空
            if($_POST['uname'] == ""){
                $this -> error('用户名不能为空',U('denglu'));
                return;
            }
            // 使用用户名为条件查询密码,再和用户提交密码比较,相同则合法
            $mod = M('yonghu');
            $_POST['uname'] = htmlspecialchars($_POST['uname']);
            $where = array('uname' => $_POST['uname']);
            $res = $mod -> where($where) -> getField('pwd');
            if($res){
                // 对用户输入的密码进行加密后再和数据库中的进行比较
                $salt = $mod -> where($where) -> getField('salt');
                $pwd = $this -> jiamimima($_POST['uname'],$_POST['pwd'],$salt);
                if($res == $pwd){
                    session('name',$_POST['uname']);
                    session('expire',3600);
                    $this -> success('登陆成功',U('fenxianziyuan'));
                    return;
                }else{
                    $this -> error('密码错误,请输入正确密码',U('denglu'));
                    return;
                }
            }else{
                $this -> error('用户名不存在,请注册',U('zhuce'));
                return;
            }  
        }
        $this->display();
    }

    public function zhuce(){
        $this->assign('title','注册');
        // 调用判断渲染方法,渲染登陆注册位置
        $this -> gongxianzhe();
        if(IS_POST){
            // 判断验证码是否输入正确
            if(!$this->check_verify($_POST['checkcode'],'')){
                $this -> error('验证码错误,请输入正确验证码',U('zhuce'));
                return;
            }
            //判断密码是否一致
            if($_POST['pwd'] !== $_POST['pwd2']){
                $this -> error('密码不一致',U('zhuce'));
                return;
            }
            // 后台使用正则判断密码是否符合规定
            if(!preg_match("/^[a-zA-Z]\w{5,17}$/",$_POST['pwd'])){
                $this -> error('密码需以字母开头，6-18个字符',U('zhuce'));
                return;
            }
            // 判断用户名是否为空
            if($_POST['uname'] == ""){
                $this -> error('用户名不能为空',U('zhuce'));
                return;
            }
            // 后台使用正则判断用户名是否符合规定
            // if(!preg_match("/^[\u4e00-\u9fa5],{0,}$/",$_POST['uname'])){
            //     $this -> error('请输入中文用户名',U('zhuce'));
            //     return;
            // }
            // 后台使用正则判断邮箱是否符合规定
            if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/",$_POST['email'])){
                $this -> error('请输入正确邮箱地址',U('zhuce'));
                return;
            }
            //判断用户名是否已注册
            $mod = M('yonghu');
            $where = array('uname' => htmlspecialchars($_POST['uname']));
            $res = $mod -> where($where) -> find();
            if($res){
                $this -> error('用户名已存在',U('zhuce'));
                return;
            }else{
                // 因不使用$_POST直接插入数据，所以也不需要删除确认密码和验证码字段
                // 随机一个六位salt
                $_POST['salt'] = $this -> generate_salt(6);
                /*对密码进行md5加密存储*/
                $_POST['pwd'] = $this -> jiamimima($_POST['uname'],$_POST['pwd'],$_POST['salt']);
                // 对用户输入数据进行字符实体化
                $data = array('uname' => htmlspecialchars($_POST['uname']),'pwd' => $_POST['pwd'],'email' => htmlspecialchars($_POST['email']),'salt' => htmlspecialchars($_POST['salt']));
                $res = $mod -> data($data) -> add();
                if($res){
                    $this -> success('用户注册成功',U('denglu'));
                    return;
                }else{
                    $this -> error('用户注册失败',U('zhuce'));
                    return;
                }                   
            }
        }
        $this->display();
    }

    // 加密密码
    public function jiamimima($yonghuming,$mima,$salt){
        $jiami = md5(md5(sha1($mima.$salt).$salt).$salt.sha1(md5($yonghuming.$salt).$salt));
        return $jiami;
    }

    // 生成随机数函数
    public function generate_salt($length){
        // 字符集，可任意添加你需要的字符  
        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
        $salt = '';
        for($i = 0;$i < $length;$i++){
            // 第一种是使用 substr 截取$chars中的任意一位字符； 
            // 第二种是取字符数组 $chars 的任意元素 
            // $salt .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
            $salt .= $chars[ mt_rand(0, strlen($chars) - 1) ];
        }
        return $salt;
    }


    // 生成验证码
    public function checkcode(){
        $config = array(
            'fontSize' => 24,// 验证码字体大小
            'length' => 1,// 验证码位数
            'useZh' => true, //是否启用中文验证码
            'imageW' => 80,
            'imageH' => 55 //验证码长宽
        );
        $Verify = new \Think\Verify($config);
        $Verify->entry();

    }

    // 检验验证码输入是否正确
    function check_verify($code,$id = ''){
        $config = array(
            'reset' => false // 验证成功后是否重置，这里才是有效的,若需要ajax和后台同时验证,需开启。
        );
        $verify = new \Think\Verify($config);
        return $verify->check($code, $id);
    }

    // 判断应该如何渲染前端模板中的 <{$gongxianzhe}> 占位符
    public function gongxianzhe(){
        if(session('name') == ''){
            $url_denglu = U('User/denglu');
            $url_zhuce = U('User/zhuce');
            $this -> assign('gongxianzhe','<a href="'.$url_denglu.'">登陆</a><a href="'.$url_zhuce.'">注册</a>');
        }else{
            $gongxianzhe = session('name');
            $url_gongxianzhe = U('User/fenxianziyuan');
            $url_zhuxiao = U('User/index');
            $this -> assign('gongxianzhe','<a href="'.$url_gongxianzhe.'">'.$gongxianzhe.'</a><a href="'.$url_zhuxiao.'">注销</a>');
        }
    }

    // 分享资源页面省市联动效果PHP处理代码 目前留有一个问题 选择技术可以准确的查到菜单,但是选择菜单时,在子菜单中不一定字段名唯一,可能其他菜单下的子菜单名会与本菜单下的子菜单同名,造成不精确查找,解决方法是用技术和菜单同时作为sql语句查询条件,但现在我考虑的代码复用问题,我决定在出现问题后在解决(通过后台判断已解决,技术时sql语句同时有两个相同的判断条件,菜单时判断条件为当前技术的值和当前菜单的值)
    // 选择过后再选择技术,子菜单不会自动消除,此问题需解决(js已解决)
    public function jishu(){
        //接收当前分类下的具体资源分类的值 接收当前选择的资源的值
        $danqianidzhi = $_POST['danqianidzhi'];
        //接收用户选择的当前分类 接收当前选择的资源id
        $dangqianid = $_POST['id'];
        //接收技术分类下的具体资源分类 接收已选择的技术分类的值
        $jishu=$_POST['jishu'];
        // 定义储存下一个分类的值,并判断当前属于哪个分类,以此定义下一个分类的字段值
        if($dangqianid == "jishu"){
            $xiageid = "caidan";
        }else if($dangqianid == "caidan"){
            $xiageid = "zicaidan";
        }
        //如何在调试过程中,看到接收到的数据,使用写文件(日志)的方式
        // file_put_contents("d:/mylog.log",$jishu."\r\n",FILE_APPEND);
        // 对要操作的数据进行字符实体化
        $xiageid = htmlspecialchars($xiageid);
        $dangqianid = htmlspecialchars($dangqianid);
        $danqianidzhi = htmlspecialchars($danqianidzhi);
        $jishu = htmlspecialchars($jishu);
         /*连接数据库*/
        $ziyuan = M('ziyuan');
        $result = $ziyuan -> query("select distinct ".$xiageid." from ziyuan where ".$dangqianid." = " . "\"" . $danqianidzhi . "\" and jishu = ". "\"" . $jishu . "\"");
        $str = "";
        foreach ($result as $k => $v) {
            $str .= $v[$xiageid] . ",";
        }
        $str = rtrim($str, ",");
        echo $str;
    }

    // ajax判断用户是否存在
    public function yonghuming(){
        //判断用户名是否已注册
        $mod = M('yonghu');
        $where = array('uname' => htmlspecialchars($_POST['uname']));
        $res = $mod -> where($where) -> find();
        if($res){
            echo $a = 1;
            return;
        }else{
            echo $a = 0;
            return;
        }
    }

    // ajax判断验证码是否正确
    public function checkyanzhenma(){
        // 判断验证码是否输入正确
        if($this->check_verify($_POST['yanzhenma'],'')){
            echo $a = 1;
            return;
        }else{
            echo $a = 0;
            return;
        }
    }


}